package demo04;

import java.util.ArrayList;
import java.util.Collections;

/*
 *  斗地主综合案例步骤：
 *      1. 准备牌
 *      2. 洗牌
 *      3. 发牌
 *      4. 看牌
 */
public class DouDiZhu {
    public static void main(String[] args) {
        ArrayList<String> poker = prepareCards(); // 准备牌
        System.out.println("备牌完毕：" + poker); // [红桃2, 方片2, 黑桃2, 梅花2, 红桃3, 方片3, 黑桃3, 梅花3,...]

        shuffleCards(poker); // 洗牌
        System.out.println("洗牌完毕：" + poker); // [红桃6, 红桃8, 黑桃10, 红桃4, 红桃9, 红桃J, 黑桃Q, 黑桃7,...]，内容被打乱
        
        ArrayList<ArrayList<String>> players = dealCards(poker); // 发牌

        watchCards(players); // 看牌
    }

    private static void watchCards(ArrayList<ArrayList<String>> players) {
        ArrayList<String> player1 = players.get(0);
        ArrayList<String> player2 = players.get(1);
        ArrayList<String> player3 = players.get(2);
        ArrayList<String> dipai = players.get(3);
        System.out.println("player1：" + player1);
        System.out.println("player2：" + player2);
        System.out.println("player3：" + player3);
        System.out.println("底牌：" + dipai);
    }

    private static ArrayList<ArrayList<String>> dealCards(ArrayList<String> poker) {
        ArrayList<ArrayList<String>> players = new ArrayList<>();
        ArrayList<String> player1 = new ArrayList<>();
        ArrayList<String> player2 = new ArrayList<>();
        ArrayList<String> player3 = new ArrayList<>();
        ArrayList<String> dipai = new ArrayList<>();

        for (int i = 0; i < poker.size(); i++) { // 给三位玩家发牌
            if (i >= 51) { // 最后三张牌发给底牌
                dipai.add(poker.get(i));
            } else if (i % 3 == 0) { // i % 3只有三种结果：0,1,2，循环使其轮流获得这三种结果，然后分别填入三个玩家的牌组
                player1.add(poker.get(i));
            } else if (i % 3 == 1) {
                player2.add(poker.get(i));
            } else {
                player3.add(poker.get(i));
            }
        }

        players.add(player1);
        players.add(player2);
        players.add(player3);
        players.add(dipai);

        return players; // 0,1,2索引为三个玩家，3索引为底牌
    }

    private static void shuffleCards(ArrayList<String> poker) { // 洗牌
        
        /*
         *  Collections类是个集合相关的工具类，里面都是静态方法，其中包含shuffer方法
         *  static void shuffle(List<?> list)：使用默认随机源对指定列表进行置换
         *  使用该方法可以把指定集合的内容顺序打乱
         */
        Collections.shuffle(poker);
    }

    private static ArrayList<String> prepareCards() { // 生成一副牌
        ArrayList<String> color = new ArrayList<>(); // 花色
        ArrayList<String> num = new ArrayList<>(); // 数字

        color.add("红桃"); // 添加花色
        color.add("方片");
        color.add("黑桃");
        color.add("梅花");

        for (int i = 2; i <= 10; i++) { // 添加数字
            num.add(i + "");
        }
        num.add("J");
        num.add("Q");
        num.add("K");
        num.add("A");

        ArrayList<String> poker = new ArrayList<>(); // 扑克
        for (String n : num) {
            for (String c : color) {
                poker.add(c + n); // 花色+数字=扑克牌
            }
        }
        poker.add("小王");
        poker.add("大王");

        return poker;
    }
}
